#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#define TRUE 1
#define FALSE 0

int check_2(int a2, int a5)
{
    int map[4] = {2,3,0,1};
    if(map[a2] != a5)
    {
         return FALSE;;
    }
    return TRUE;
}
int check_3_3(int *a)
{
    if((a[2] == a[1]) || (a[2] == a[3]) || (a[2] == a[5]))
    {
        return FALSE;;
    }
    return TRUE;
}

int check_3_6(int *a)
{
    if((a[5] == a[1]) || (a[5] == a[3]) || (a[5] == a[2]))
    {
        return FALSE;;
    }
    return TRUE;
}

int check_3_2(int *a)
{
    if((a[1] == a[5]) || (a[1] == a[3]) || (a[1] == a[2]))
    {
        return FALSE;;
    }
    return TRUE;
}
int check_3_4(int *a)
{
    if((a[3] == a[5]) || (a[3] == a[1]) || (a[3] == a[2]))
    {
        return FALSE;;
    }
    return TRUE;
}


int check_3(int *a)
{
    switch(a[2])
    {
        case 0:
            if(TRUE != check_3_3(a))
            {
                return FALSE;;
            }
            if(TRUE == check_3_4(a))
            {
                return FALSE;
            }
            if(TRUE == check_3_2(a))
           {
               return FALSE;
           }
            if(TRUE == check_3_6(a))
           {
               return FALSE;
           }

           break;
        case 1:
             if(TRUE != check_3_6(a))
            {
                return FALSE;
            }
            if(TRUE == check_3_4(a))
            {
                return FALSE;
            }
            if(TRUE == check_3_2(a))
           {
               return FALSE;
           }
            if(TRUE == check_3_3(a))
           {
               return FALSE;
           }
           break;
        case 2:
              if(TRUE != check_3_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_3_4(a))
            {
                return FALSE;
            }
            if(TRUE == check_3_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_3_6(a))
           {
               return FALSE;
           }
           break;
        case 3:
            if(TRUE != check_3_4(a))
            {
                return FALSE;
            }
            if(TRUE == check_3_3(a))
            {
                return FALSE;
            }
            if(TRUE == check_3_2(a))
           {
               return FALSE;
           }
            if(TRUE == check_3_6(a))
           {
               return FALSE;
           }
           break;
    }

    return TRUE;
}

int check_4_1(int *a)
{
    if(a[0] == a[4])
    {
        return TRUE;
    }
    return FALSE;;
}
int check_4_2(int *a)
{
    if(a[1] == a[6])
    {
        return TRUE;
    }
    return FALSE;;
}
int check_4_3(int *a)
{
    if(a[0] == a[8])
    {
        return TRUE;
    }
    return FALSE;;
}
int check_4_4(int *a)
{
    if(a[5] == a[9])
    {
        return TRUE;
    }
    return FALSE;;
}


int check_4(int *a)
{
    switch(a[3])
    {
        case 0:
            if(TRUE != check_4_1(a))
            {
                return FALSE;
            }
            if(TRUE == check_4_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_4_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_4_4(a))
           {
               return FALSE;
           }

           break;
        case 1:
            if(TRUE != check_4_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_4_1(a))
            {
                return FALSE;
            }
            if(TRUE == check_4_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_4_4(a))
           {
               return FALSE;
           }
           break;
        case 2:
            if(TRUE != check_4_3(a))
            {
                return FALSE;
            }
            if(TRUE == check_4_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_4_1(a))
           {
               return FALSE;
           }
            if(TRUE == check_4_4(a))
           {
               return FALSE;
           }
           break;
        case 3:
            if(TRUE != check_4_4(a))
            {
                return FALSE;
            }
            if(TRUE == check_4_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_4_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_4_1(a))
           {
               return FALSE;
           }
           break;
    }
    return TRUE;
}
int check_5_1(int *a)
{
    if(a[4] == a[7])
    {
        return TRUE;
    }
    return FALSE;;
}
int check_5_2(int *a)
{
    if(a[3] == a[4])
    {
        return TRUE;
    }
    return FALSE;;
}
int check_5_3(int *a)
{
    if(a[4] == a[8])
    {
        return TRUE;
    }
    return FALSE;;
}
int check_5_4(int *a)
{
    if(a[4] == a[6])
    {
        return TRUE;
    }
    return FALSE;;
}

int check_5(int *a)
{
    switch(a[4])
    {
        case 0:
            if(TRUE != check_5_1(a))
            {
                return FALSE;
            }
            if(TRUE == check_5_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_5_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_5_4(a))
           {
               return FALSE;
           }

           break;
        case 1:
            if(TRUE != check_5_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_5_1(a))
            {
                return FALSE;
            }
            if(TRUE == check_5_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_5_4(a))
           {
               return FALSE;
           }
           break;
        case 2:
            if(TRUE != check_5_3(a))
            {
                return FALSE;
            }
            if(TRUE == check_5_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_5_1(a))
           {
               return FALSE;
           }
            if(TRUE == check_5_4(a))
           {
               return FALSE;
           }
           break;
        case 3:
            if(TRUE != check_5_4(a))
            {
                return FALSE;
            }
            if(TRUE == check_5_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_5_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_5_1(a))
           {
               return FALSE;
           }
           break;
    }
    return TRUE;
}

int check_6_1(int *a)
{
    if((a[1] == a[7]) && (a[3] == a[7]))
    {
        return TRUE;
    }
    return FALSE;;
}
int check_6_2(int *a)
{
     if((a[0] == a[7]) && (a[5] == a[7]))
    {
        return TRUE;
    }
    return FALSE;;
}
int check_6_3(int *a)
{
    if((a[2] == a[7]) && (a[9] == a[7]))
    {
        return TRUE;
    }
    return FALSE;;
}
int check_6_4(int *a)
{
    if((a[4] == a[7]) && (a[8] == a[7]))
    {
        return TRUE;
    }
    return FALSE;;
}

int check_6(int *a)
{
    switch(a[5])
    {
        case 0:
            if(TRUE != check_6_1(a))
            {
                return FALSE;
            }
            if(TRUE == check_6_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_6_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_6_4(a))
           {
               return FALSE;
           }

           break;
        case 1:
            if(TRUE != check_6_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_6_1(a))
            {
                return FALSE;
            }
            if(TRUE == check_6_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_6_4(a))
           {
               return FALSE;
           }
           break;
        case 2:
            if(TRUE != check_6_3(a))
            {
                return FALSE;
            }
            if(TRUE == check_6_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_6_1(a))
           {
               return FALSE;
           }
            if(TRUE == check_6_4(a))
           {
               return FALSE;
           }
           break;
        case 3:
            if(TRUE != check_6_4(a))
            {
                return FALSE;
            }
            if(TRUE == check_6_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_6_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_6_1(a))
           {
               return FALSE;
           }
           break;
    }
    return TRUE;
}
int check_7(int *a)
{
    int count[4] = {0};
    int i = 0;
    for (i = 0; i < 10 ; i++)
    {
        switch(a[i])
        {
            case 0:
               count[2]++;
               break;
            case 1:
               count[1]++;
               break;
            case 2:
               count[0]++;
               break;
            case 3:
               count[3]++;
               break;
        }
    }

    switch(a[6])
    {
        case 0:
           if((count[0] >= count[1]) ||
              (count[0] >= count[2]) ||
              (count[0] >= count[3]))
           {
              return FALSE;;
           }

           break;
        case 1:
            if((count[1] >= count[0]) ||
              (count[1] >= count[2]) ||
              (count[1] >= count[3]))
           {
              return FALSE;;
           }
           break;
        case 2:
            if((count[2] >= count[1]) ||
              (count[2] >= count[0]) ||
              (count[2] >= count[3]))
           {
              return FALSE;;
           }
           break;
        case 3:
            if((count[3] >= count[1]) ||
              (count[3] >= count[2]) ||
              (count[3] >= count[0]))
           {
              return FALSE;;
           }
           break;
    }

    return TRUE;
}

int check_8_1_equer(int a1, int a2)
{
    if(a1 > a2)
    {
        if((a1 - a2) > 1)
        {
            return TRUE;
        }
    }
    else
    {
        if((a2 - a1) > 1)
        {
            return TRUE;
        }
    }
    return FALSE;;
}

int check_8_1(int *a)
{
   return check_8_1_equer(a[6], a[0]);
}
int check_8_2(int *a)
{
    return check_8_1_equer(a[4], a[0]);
}
int check_8_3(int *a)
{
    return check_8_1_equer(a[1], a[0]);
}
int check_8_4(int *a)
{
    return check_8_1_equer(a[9], a[0]);
}

int check_8(int *a)
{
    switch(a[7])
    {
        case 0:
            if(TRUE != check_8_1(a))
            {
                return FALSE;
            }
            if(TRUE == check_8_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_8_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_8_4(a))
           {
               return FALSE;
           }

           break;
        case 1:
            if(TRUE != check_8_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_8_1(a))
            {
                return FALSE;
            }
            if(TRUE == check_8_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_8_4(a))
           {
               return FALSE;
           }
           break;
        case 2:
            if(TRUE != check_8_3(a))
            {
                return FALSE;
            }
            if(TRUE == check_8_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_8_1(a))
           {
               return FALSE;
           }
            if(TRUE == check_8_4(a))
           {
               return FALSE;
           }
           break;
        case 3:
            if(TRUE != check_8_4(a))
            {
                return FALSE;
            }
            if(TRUE == check_8_2(a))
            {
                return FALSE;
            }
            if(TRUE == check_8_3(a))
           {
               return FALSE;
           }
            if(TRUE == check_8_1(a))
           {
               return FALSE;
           }
           break;
    }
    return TRUE;
}

int check_9_1(int *a)
{
    if(a[4] == a[5])
    {
        return TRUE;
    }
    return FALSE;;
}
int check_9_2(int *a)
{
    if(a[4] == a[9])
    {
        return TRUE;
    }
    return FALSE;;
}int check_9_3(int *a)
{
    if(a[4] == a[1])
    {
        return TRUE;
    }
    return FALSE;;
}int check_9_4(int *a)
{
    if(a[4] == a[8])
    {
        return TRUE;
    }
    return FALSE;;
}

int check_9(int *a)
{
    if(a[0] == a[5])
    {
        switch(a[8])
        {
            case 0:
                if(TRUE == check_9_1(a))
                {
                    return FALSE;
                }
                if(TRUE != check_9_2(a))
                {
                    return FALSE;
                }
                if(TRUE != check_9_3(a))
               {
                   return FALSE;
               }
                if(TRUE != check_9_4(a))
               {
                   return FALSE;
               }

               break;
            case 1:
                if(TRUE == check_9_2(a))
                {
                    return FALSE;
                }
                if(TRUE != check_9_1(a))
                {
                    return FALSE;
                }
                if(TRUE != check_9_3(a))
               {
                   return FALSE;
               }
                if(TRUE != check_9_4(a))
               {
                   return FALSE;
               }
               break;
            case 2:
                if(TRUE == check_9_3(a))
                {
                    return FALSE;
                }
                if(TRUE != check_9_2(a))
                {
                    return FALSE;
                }
                if(TRUE != check_9_1(a))
               {
                   return FALSE;
               }
                if(TRUE != check_9_4(a))
               {
                   return FALSE;
               }
               break;
            case 3:
                if(TRUE == check_9_4(a))
                {
                    return FALSE;
                }
                if(TRUE != check_9_2(a))
                {
                    return FALSE;
                }
                if(TRUE != check_9_3(a))
               {
                   return FALSE;
               }
                if(TRUE != check_9_1(a))
               {
                   return FALSE;
               }
               break;
        }
    }
    else
    {
        switch(a[8])
        {
            case 0:
                if(TRUE != check_9_1(a))
                {
                    return FALSE;
                }
                if(TRUE == check_9_2(a))
                {
                    return FALSE;
                }
                if(TRUE == check_9_3(a))
               {
                   return FALSE;
               }
                if(TRUE == check_9_4(a))
               {
                   return FALSE;
               }

               break;
            case 1:
                if(TRUE != check_9_2(a))
                {
                    return FALSE;
                }
                if(TRUE == check_9_1(a))
                {
                    return FALSE;
                }
                if(TRUE == check_9_3(a))
               {
                   return FALSE;
               }
                if(TRUE == check_9_4(a))
               {
                   return FALSE;
               }
               break;
            case 2:
                if(TRUE != check_9_3(a))
                {
                    return FALSE;
                }
                if(TRUE == check_9_2(a))
                {
                    return FALSE;
                }
                if(TRUE == check_9_1(a))
               {
                   return FALSE;
               }
                if(TRUE == check_9_4(a))
               {
                   return FALSE;
               }
               break;
            case 3:
                if(TRUE != check_9_4(a))
                {
                    return FALSE;
                }
                if(TRUE == check_9_2(a))
                {
                    return FALSE;
                }
                if(TRUE == check_9_3(a))
               {
                   return FALSE;
               }
                if(TRUE == check_9_1(a))
               {
                   return FALSE;
               }
               break;
        }
    }

    return TRUE;
}
int QSORT_comp(const void*a,const void*b)
{
    return *(int*)a-*(int*)b;
}

int check_10(int *a)
{
    int count[4] = {0};
    int i = 0;
    int map[4]= {3,2,4,1};
    for(i = 0; i < 10; i++)
    {
        count[a[i]]++;
    }
    qsort(count ,4, sizeof(int),QSORT_comp); /* Output sorted list: */

    if(map[a[9]] != (count[3] - count[0]))
    {
        return FALSE;;
    }
    return TRUE;
}

int check(int *a, int *result)
{
    int count = 0;
    if(TRUE == check_2(a[1], a[4]))
    {
        count++;
        result[1] = 1;
    }
    if(TRUE == check_3(a))
    {
        count++;
        result[2] = 1;
    }

    if(TRUE == check_4(a))
    {
        count++;
        result[3] = 1;
    }
    if(TRUE == check_5(a))
    {
        count++;
        result[4] = 1;
    }
    if(TRUE == check_6(a))
    {
        count++;
        result[5] = 1;
    }
    if(TRUE == check_7(a))
    {
        count++;
        result[6] = 1;
    }
    if(TRUE == check_8(a))
    {
        count++;
        result[7] = 1;
    }
    if(TRUE == check_9(a))
    {
        count++;
        result[8] = 1;
    }
    if(TRUE == check_10(a))
    {
       count++;
       result[9] = 1;
    }
    return count;
}

int check_all(int *a, int offset)
{
    int i = 0;
    int count = 0;
    int result[10] = {0};
    char ret_map[4] = {'X','O','C','D'};
    char map[4] = {'A','B','C','D'};
    if(offset >= 10)
    {
        result[0] = TRUE;
        if((count=check(a,result)) > 8)
        {
            printf("--------------------\r\n");
            for(i = 0; i < 10 ; i++)
            {
                //printf("%d(%c %c);", i+1, map[a[i]], ret_map[result[i]]);
                printf("%d(%c);", i+1, map[a[i]]);
            }
            printf("\r\n");
            printf("success %d@@@@@@@@@@@@@\r\n", count);
        }
        return TRUE;
    }
    for(i = 0; i < 4 ; i++)
    {
        a[offset] = i;
        check_all(a, offset+1);
    }
    return TRUE;
}

int main()
{
   int a[10] = {0};

   check_all(a, 0);
}
